In dit hoofdstuk treft u een overzicht aan van de functies en conventies in XML om u snel te kunnen redden in avenue.quark.
De onderdelen van een XML-document
Een XML-document bestaat uit de volgende onderdelen, in deze volgorde:
1. Een XML-declaratie (optioneel, maar ten sterkste aanbevolen)
2. Een DOCTYPE-declaratie en DTD (optioneel), met commentaar, verwerkingsinstructies en entiteitsreferenties
3. XML-elementen (en hun attributen), commentaar, verwerkingsinstructies en entiteitsreferenties)
XML-declaratie
De XML-declaratie, indien aanwezig, moet de eerste regel in een XML-document zijn. Deze geeft aan de XML-versie waarmee het document is gemaakt en of er in het bestand ook verwijzingen zijn naar andere bestanden. Bijvoorbeeld:
<?xml version="1.0" standalone="no"?>DOCTYPE-declaratie (inclusief DTD)
De DOCTYPE-declaratie die de DTD van het document specificeert hoort na de XML-declaratie te staan en vóór de begincode van het rootelement. Een DTD kan uit twee delen bestaan: De externe subset en de interne subset. Als een document alleen een externe subset heeft, ziet het eruit als volgt:
<?xml version="1.0" standalone="no">Heeft een document alleen een interne subset dan ziet het er als volgt uit:
<?xml version="1.0" standalone="yes">Heeft een document zowel een externe als een interne subset, dan ziet het eruit als volgt:
<?xml version="1.0" standalone="no">Elementen
Een element bestaat uit een begincode (<codeNaam>), een beetje content, en een eindcode (</codeNaam>):
<codeNaam>Content komt hier.</codeNaam>Een uitzondering is de lege code, wat één code kan zijn met een schuine streep vóór de >:
<legeCode/>Alle elementen moeten goed zijn genest, wat inhoudt dat de meest recent ge-opende code moet zijn gesloten voordat u andere codes kunt sluiten. De volgende regel in een XML-document zou bijvoorbeeld illegaal zijn, omdat <code2> niet wordt gesloten voordat <code1> wordt gesloten:
<code1><code2>Content komt hier.</code1></code2>Elk XML-document moet een zogenaamd rootelement hebben waarin alle andere elementen in het document staan.
Bij het invoeren van elementnamen spelen hoofd- en kleine letters een grote rol. Iedere elementnaam moet beginnen met een letter of een onderstreepteken (_); de resterende tekens in de namen kunnen letters, onderstreeptekens, getallen, afbreekstreepjes en punten zijn, maar geen spaties of tabstops.
Attributen
Elementen kunnen attributen hebben als onderdeel van hun begincodes (of, voor lege elementen, als onderdeel van de gecombineerde begin/eindcode). Een attribuut bestaat uit een attribuutnaam gevolgd door een is gelijk-teken en vervolgens een attribuutwaarde tussen aanhalingstekens. Bijvoorbeeld:
<elementNaam attribuutNaam="attribuutWaarde">Content</elementNaam>Commentaar
Commentaar bestaat uit tekst die tussen een <!-- en een --> staat. De content van commentaren wordt door de XML processors genegeerd. In commentaren mag geen "--" of andere commentaren staan.
<!-- Dit is commentaar. Tekens zoals < en > zijn hier toegestaan. -->Verwerkingsinstructies
Een verwerkingsinstructie bestaat uit tekst die tussen een <? en een ?> staat. Verwerkingsinstructies worden alleen door XML processors gelezen en mogen geen content bevatten. De syntax voor verwerkingsinstructies is als volgt:
<?doelinstructie?>Tekenverwijzingen
Een tekenverwijzing is een manier om Unicode-tekens weer te geven in geparsde ofte wel geanalyseerde tekstgegevens. De syntax voor tekenverwijzingen is als volgt:
&#UnicodeTekenwaarde;Entiteitsreferenties
Een entiteitsreferentie is een gegeven dat de plaats inneemt van een specifiek teken, een bepaalde tekststring of specifiek bestand. Entiteitsreferenties in een XML-document staan altijd tussen een ampersand (&) en een puntkomma (;). > bijvoorbeeld is een groter dan-teken (<), dat niet in XML-content mag worden opgenomen, behalve als entiteitsreferentie.
De betekenis van iedere entiteitsreferentie die in een XML-document wordt gebruikt, moet worden gedefinieerd in de DTD van het document, met uitzondering van de volgende reeds gedefinieerde tekenentiteitsreferenties, die kunnen worden gebruikt zonder dat ze zijn gedefinieerd:
Teken | Entiteitsreferentie |
< | < |
> | > |
& | & |
" | " |
' | ' |
Goed gestructureerd XML-document
Om zich goed gestructureerd te mogen noemen, moet een XML-document zich houden aan de volgende regels:
Geldig XML-document
Een geldig XML-document is een XML-document dat goed gestructureerd is en zich houdt aan de conventies van de DTD die is gespecificeerd door zijn DOCTYPE-declaratie.
In dit hoofdstukje treft u een overzicht aan van de functies en conventies van DTD's om u snel te kunnen redden in avenue.quark
De onderdelen van een DTD
Een DTD kan zijn samengesteld uit de volgende onderdelen, niet per se in onderstaande volgorde:
Elementtypedeclaraties
De syntax voor een elementtypedeclaratie is als volgt:
<!ELEMENT elementNaam (elementContent)>Elementnamen zijn gevoelig voor het gebruik van hoofd- en kleine letters. Iedere elementnaam moet beginnen met een letter of een onderstreepteken (_); resterende lettertekens in de naam kunnen letters, onderstreeptekens, getallen, afbreektekens en punten zijn, maar spaties of tabstops zijn niet toegestaan.
Elementcontent kan bestaan uit geanalyseerde tekstgegevens (dat wil zeggen tekst en entiteitsreferenties, uitgedrukt als ) en/of andere elementtypes. De volgende symbolen kunnen na iedere elementnaam of haakje sluiten in de elementcontentdefinitie worden ingevoegd:
Symbool | Betekenis |
Geen | Precies één |
+ | Eén of meer |
* | nul of meer |
? | Nul of één |
Wilt u na één element nog een element opnemen, gebruik dan een komma:
<!ELEMENT elementNaam (element1, element2)>Om aan te geven dat content óf het ene óf het andere element kan bevatten, moet u gebruik maken van een |:
<!ELEMENT elementNaam (element1 | element2)>Om in een element een combinatie van specifieke elementen en #PCDATA in willekeurige volgorde op te kunnen nemen, moet u de volgende syntax hanteren:
<!ELEMENT elementNaam (#PCDATA | element1 | element2)*>Om in een element een willekeurige combinatie van elementen en #PCDATA in willekeurige volgorde op te kunnen nemen, moet u de volgende syntax hanteren (let op het ontbreken van haakjes):
<!ELEMENT elementNaam WILLEKEURIG>Om een leeg element te definiëren, moet u de volgende syntax hanteren (let op het ontbreken van haakjes):
<!ELEMENT elementNaam LEEG>Attribuutdeclaraties
De syntax voor één attribuutdefinitie is als volgt:
<!ATTLIST elementNaam attribuutNaam attribuutType standaardWaarde>Attribuutnamen zijn gevoelig voor het gebruik van hoofd- en kleine letters. Iedere attribuutnaam moet beginnen met een letter of een onderstreepteken (_); resterende lettertekens in de naam kunnen letters, onderstreeptekens, getallen, afbreektekens en punten zijn, maar spaties of tabstops zijn niet toegestaan.
U kunt met de volgende attribuuttypes werken:
Attribuuttype | Betekenis |
CDATA | Tekstgegevens en entiteitsreferenties, tussen aanhalingstekens ("") |
ID | Moet een unieke naam* bevatten voor elk element van dit type |
IDREF | De unieke ID-naam* van een element in het XML-bestand |
ENTITY | Een niet geparsde externe entiteitsreferentienaam* gedefinieerd in de DTD |
ENTITIES | Een lijst met ENTITY-namen, gescheiden door spaties |
Opsomattribuut | Een lijst met namen* tussen haakjes, gescheiden door |-tekens tussen haakjes |
NMTOKEN | Een waarde die alleen NaamTeken-tekens** bevat |
NMTOKENS | Een lijst met NMTOKEN's, gescheiden door spaties |
NOTATION | De naam van een notatie gedefinieerd in de DTD |
Opsom NOTATION | Een lijst met NOTATION's, gescheiden door |-tekens tussen haakjes |
*Namen moeten beginnen met een letter of onderstreepteken (_); resterende lettertekens in de naam kunnen letters, onderstreeptekens, getallen, afbreektekens en punten zijn, maar spaties of tabstops zijn niet toegestaan.
**NaamTeken-tekens zijn letters, onderstreeptekens, getallen, afbreektekens of punten, maar geen spaties of tabstops.
We kennen de volgende standaardattribuutwaarden:
Attribuuttype | Betekenis |
#REQUIRED | Dit attribuut moet worden gespecificeerd door het element |
#IMPLIED | Dit attribuut kan wel of niet worden gebruikt |
#FIXED waarde | Indien niet gespecificeerd, gaan we uit van een attribuuttype waarde; indien wel gespecificeerd, moet het waarde zijn |
standaardWaarde | Indien niet gespecificeerd, gaan we uit van een attribuuttype standaardWaarde |
Commentaar
Commentaar bestaat uit tekst die tussen een <!-- en een --> staat. De content van commentaren wordt door de XML- processors genegeerd. In commentaar mogen geen "--" en andere commentaren staan.
<!-- Dit is commentaar. Tekens zoals < en > zijn hier toegestaan. -->Tekenverwijzingen
Een tekenverwijzing is een manier om Unicode-tekens weer te geven in geparsde ofte wel geanalyseerde tekstgegevens. De syntax voor tekenverwijzingen is als volgt:
&#UnicodeTekenwaarde;Entiteitsreferentiedeclaraties
Er zijn vijf entiteitstypen. De syntax voor hun declaratie is als volgt:
Type | Syntax |
Geparsde interne | <!ENTITY entititeitsNaam "entiteitstekst"> |
Geparsde externe | <!ENTITY entititeitsNaam SYSTEM "URL van bestand"> OF <!ENTITY entititeitsNaam PUBLIC "bestandsnaam" "URL van bestand"> |
Niet geparsde externe | <!ENTITY entititeitsNaam SYSTEM "URL van bestand" NDATA notatieNaam> OF <!ENTITY entititeitsNaam PUBLIC "bestandsnaam" "URL van bestand" NDATA notatieNaam> |
Interne parameter | <!ENTITY % entititeitsNaam "entiteitstekst"> |
Externe parameter | <!ENTITY % entititeitsNaam SYSTEM "URL van bestand"> OF <!ENTITY % entititeitsNaam PUBLIC "bestandsnaam" "URL van bestand"> |
De syntax voor het gebruik van de eerste drie types entiteitsreferenties is &entiteitsNaam;. De syntax voor een parameterentiteit is %entiteitsNaam;. Parameterentiteitsreferenties worden altijd geparsd en mogen alleen in een DTD worden gebruikt.
Notatiedeclaraties
Notatiedeclaraties moeten op een van beide onderstaande manieren worden gespecificeerd:
<!NOTATION notatieNaam SYSTEM "Externe ID-code">De externe ID-code moet de naam zijn van een programma dat bestanden waaraan deze notatie is toegekend, kan verwerken of op het scherm weergeven. Bijvoorbeeld:
<!NOTATION gif SYSTEM "Microsoft Internet Explorer">N.B.: Het is aan het programma dat de XML verwerkt om de URL door te geven aan het programma dat door de externe ID-code wordt gedefinieerd.
Verwerkingsinstructies
Een verwerkingsinstructie bestaat uit tekst die tussen een <? en een ?> staat. Verwerkingsinstructies worden alleen gelezen door XML processors en er mag geen content instaan. De syntax voor verwerkingsinstructies is als volgt:
<?doelinstructie?>
Stel: u heeft zo juist een XML-bestand vanuit avenue.quark geëxporteerd en wanneer u dit gaat bekijken in uw tekstverwerker ziet u daar een kleine letter "a" staan met een accent waar u eigenlijk het symbool voor handelsmerk had verwacht. Bij nader inzien staan er veel verkeerde symbolen in de tekst. Wat is er gebeurd?
Dit is typisch een geval waarbij uw tekstverwerker de coderingen die worden gebruikt in uw XML-bestand niet ondersteunt. In de volgende alinea's zullen we dit probleem nader uit de doeken doen.
Wat is een tekenset?
Een tekenset is een specificatie die een set lettertekens toewijst aan corresponderende numerieke waarden. De letter "M" bijvoorbeeld wordt door de ASCII-tekenset toegewezen aan de numerieke waarde 77, de "N" aan de numerieke waarde 78, de "O" aan 79 enzovoort.
Door de toepassing van een tekenset in een tekstbestand kan een programma het tekstbestand op het scherm vertalen in correcte lettertekens. Zonder tekenset is een tekstbestand gewoon een reeks getallen. Als u een tekstbestand bekijkt met behulp van de verkeerde tekenset, ziet u een hoop vreemde tekens op uw scherm, omdat het programma dat het bestand opent de numerieke waarden toewijst aan de verkeerde tekenset.
Hieronder ziet u een overzicht van alle tekensets:
Avenue.quark ondersteunt de UTF-8-, UTF-16- en Shift-JIS-tekensets.
De tekens onder en boven de 128
U kunt de meeste tekensets verdelen in twee delen: de eerste 128 tekens (de lagere reeks) en alle tekens daarna (de bovenste reeks).
Over het algemeen worden de tekens in de lagere reeks van de meeste teken-sets toegewezen aan dezelfde lettertekens. In deze reeks vinden we de tekens az, AZ, 09, een handjevol interpunctietekens, plus een paar speciale besturingstekens.
Pas als u terechtkomt in de bovenste reeks kunt u in de problemen komen. De lettertekens onder MacRoman en Windows Latin 1 bijvoorbeeld zijn onder de 128 vrijwel identiek. Als u dus bestanden heeft waarin alleen lettertekens voorkomen uit die reeks en deze bestanden overzet van Mac OS naar Windows, zullen deze er prima uitzien. Maar als in deze bestanden lettertekens uit de bovenste reeks voorkomen, dan kunt u nogal vreemde resultaten krijgen, omdat per platform aan veel van deze waarden weer andere symbolen zijn toegewezen. Een letterteken dat er onder Mac OS bijvoorbeeld uitkomt als een symbool voor handelsmerk kan onder Windows best wel een superieure letter "a" zijn.
Wanneer u op uw scherm dergelijke rare lettertekens ziet, komt dat omdat het programma dat de tekst op uw scherm zet niet weet welke tekenset voor die tekst is gebruikt, of omdat het programma de tekst niet met zijn speciale tekenset kan weergeven.
De juiste tekenset specificeren
U kunt aangeven welke tekenset in een XML-bestand moet worden gebruikt door een tekensetspecificatie op te nemen in de XML-declaratie van het bestand, zoals hier:
<?xml version="1.0" standalone="yes" encoding="Shift_JIS"?>Als een XM L-bestand geen tekensetspecificatie heeft, gaat avenue.quark ervan uit dat het bestand gebruik maakt van de UTF-8-tekenset.
Wanneer u een XML-bestand via avenue.quark bewaart, geeft u op welke tekenset wordt gebruikt in het venster-/uitrolmenu Tekenset, waarna avenue.quark automatisch het juiste tekensetattribuut gebruikt.
Tekensets en DTD's
In XML kunt u de gebruikte tekenset in een XML-bestand specificeren. Het geeft echter geen manier aan om de tekenset voor een afzonderlijk DTD-bestand te definiëren.
Gelukkig doet avenue.quark dat wel. Om de tekenset te specificeren voor een afzonderlijke DTD, moet u gewoon de volgende tekst als de eerste regel in het bestand intikken:
<? xml encoding="encodingName" ?>Om van een afzonderlijke DTD bijvoorbeeld een UTF-16 DTD te maken, voegt u aan het begin van het bestand gewoon de volgende regel toe:
<? xml encoding="UTF-16" ?>